网络缓冲区溢出攻击的攻击方式有哪些
网络缓冲区溢出攻击的攻击方式有以下这些:
植入法代码放置攻击:攻击者向被攻击的程序植入一个字符串,程序会把这个字符串放到缓冲区里。这个字符串包含可以在被攻击的硬件平台上运行的指令序列。攻击者用被攻击程序的缓冲区来存放攻击代码,缓冲区可以设在任何地方,如堆栈(stack,自动变量)、堆(heap,动态分配的内存区)和静态资料区。
参数传递法代码放置攻击:如果被攻击的程序含有攻击者想要的代码,攻击者所要做的只是对代码传递一些参数。例如,攻击代码要求执行“exec (/bin/sh)”,而在libc库中代码执行“exec (arg)”,其中arg是一个指向一个字符串的指针参数,那么攻击者只要把传入的参数指针改向指向“/bin/sh”即可。
函数返回地址攻击:当一个函数调用发生时,调用者会在堆栈中留下函数返回地址,它包含了函数结束时返回的地址。攻击者通过溢出这些自动变量,使这个返回地址指向攻击代码,这样就改变了程序的返回地址,当函数调用结束时,程序跳转到攻击者设定的地址,而不是原先的地址。这类的缓冲区进出被称为“stack smashing attack”,是目前常用的缓冲区溢出攻击方式。
函数指针攻击:可以用来定位任何地址空间。例如,
void(*foo)()
中声明了一个返回值为void函数指针类型的变量foo。所以攻击者只需在任何空间内的函数指针附近找到一个能够溢出的缓冲区,然后溢出这个缓冲区来改变函数指针即可。当程序通过函数指针调用函数时,程序的流程就会发生改变,以实现攻击者的目的。长跳转缓冲区攻击:在C语言中包含了一个简单的检验/恢复系统,称为“setjmp/longjmp”,意思是在检验点设定“setjmp(buffer)”,用“longjmp(buffer)”来恢复检验点。如果攻击时能够进入缓冲区的空间,那么“longjmp(buffer)”实际上是跳转到攻击者的代码。像函数指针一样,longjmp缓冲区能够指向任何地方,所以攻击者所要做的就是找到一个可供溢出的缓冲区。
放置综合代码的流程控制攻击:最常见的缓冲区溢出攻击方法是在一个字符串中综合了代码植入和函数返回地址。攻击者定位一个可供溢出的自动变量,向程序传递一个很大的字符串,引发缓冲区溢出,改变活动记录的同时植入了代码。攻击者可以在一个缓冲区内放置代码,这是不能溢出的缓冲区。再通过溢出另外一个缓冲区来转移程序的指针。如果攻击者试图使用已经常驻的代码而不是从外部植入代码,那么攻击者通常必须把代码作为参数调用。因为C语言在习惯上只为用户和参数开辟很小的缓冲区,因此这种漏洞攻击的实例十分常见。